package servlet.admin;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet("/test")
public class ExcelServlet extends HttpServlet{
	private static final long serialVersionUID = 1L; 
	  // 上传文件存储目录
	  private static final String UPLOAD_DIRECTORY = "upload";
	  // 上传配置
	  private static final int MEMORY_THRESHOLD   = 1024 * 1024 * 3;  // 3MB
	  private static final int MAX_FILE_SIZE      = 1024 * 1024 * 40; // 40MB
	  private static final int MAX_REQUEST_SIZE   = 1024 * 1024 * 50; // 50MB
	 
	 
	  protected void doGet(HttpServletRequest request, HttpServletResponse response)
	          throws ServletException, IOException {
	    doPost(request, response);  
	  }
	 
	  protected void doPost(HttpServletRequest request, HttpServletResponse response)
	          throws ServletException, IOException {
		  System.out.println("doPost in Excel2Db");
	    String xlsFilePath="";//最后更新为上传xls在服务器上的绝对地址，由excelUpload()返回
	    String result="Error";  //最后更新为xls文件导入数据库正确与否的字符串，由excel2Db返回
	    System.out.println("doPost in Excel2Db");
	    
	    //1. 调用excelUpload()将传递过来的excel表写入服务器硬盘，并返回该文件路径------
	    xlsFilePath =excelUpload(request,response);
	    
	    //2. 调用excel2Db()将xlsFilePath的excel文件内容读取出来并写入数据库-----------
	    if(!xlsFilePath.equals("Error")){
	      try {
	        result=excel2Db(xlsFilePath);
	      } catch (FileNotFoundException ex) {
	        Logger.getLogger(ExcelServlet.class.getName()).log(Level.SEVERE, null, ex);
	      } catch (BiffException ex) {
	        Logger.getLogger(ExcelServlet.class.getName()).log(Level.SEVERE, null, ex);
	      }
	    }else{
	      result="Error";
	    }
	          
	    //3. 将2的结果result写入响应包
	    //System.out.println("result:="+result);
	    response.getWriter().print(result);  
	  }
	 
	  //处理excel文件上传的相关程序
	  protected String excelUpload(HttpServletRequest request, HttpServletResponse response)
	          throws ServletException, IOException {
	    String answer="";
	    // 检测是否为多媒体上传
	    if (!ServletFileUpload.isMultipartContent(request)) {
	        // 如果不是则停止
	        PrintWriter writer = response.getWriter();
	        writer.println("Error: 表单必须包含 enctype=multipart/form-data");
	        writer.flush();
	 
	        return "Error";
	    }
	 
	    // 配置上传参数
	    DiskFileItemFactory factory = new DiskFileItemFactory();
	    // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
	    factory.setSizeThreshold(MEMORY_THRESHOLD);
	    // 设置临时存储目录
	    factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
	 
	    ServletFileUpload upload = new ServletFileUpload(factory);
	 
	    // 设置最大文件上传值
	    upload.setFileSizeMax(MAX_FILE_SIZE);        
	    // 设置最大请求值 (包含文件和表单数据)
	    upload.setSizeMax(MAX_REQUEST_SIZE);
	    // 中文处理
	    upload.setHeaderEncoding("UTF-8"); 
	 
	    // 构造临时路径来存储上传的文件
	    // 这个路径相对当前应用的目录,这是tomcat5.6.7能用的
	    //String uploadPath = request.getServletContext().getRealPath("./") + File.separator + UPLOAD_DIRECTORY;
	    // 这个路径相对当前应用的目录,这是tomcat8以上能用的
	   String uploadPath = this.getClass().getClassLoader().getResource("../../").getPath()+ File.separator + UPLOAD_DIRECTORY;
	    // 如果目录不存在则创建
	    File uploadDir = new File(uploadPath);
	    if (!uploadDir.exists()) {
	        uploadDir.mkdir();
	    }
	 
	    try {
	        // 解析请求的内容提取文件数据
	        @SuppressWarnings("unchecked")
	        List<FileItem> formItems = upload.parseRequest(request);
	        if (formItems != null && formItems.size() > 0) {
	            // 迭代表单数据
	            for (FileItem item : formItems) {
	                // 处理不在表单中的字段
	                if (!item.isFormField()) {
	                    String fileName = new File(item.getName()).getName();
	                    String filePath = uploadPath + File.separator + fileName;
	                    File storeFile = new File(filePath);
	                    // 在控制台输出文件的上传路径
	                    //System.out.println(filePath);
	                    answer=filePath;
	                    // 保存文件到硬盘
	                    item.write(storeFile);
	                    //request.setAttribute("message","文件上传成功!");
	                }
	            }
	        }
	    } catch (Exception ex) {
	        System.out.println("erro in Excel2DbServlet excelUpload()"+ex.getMessage());
	    }  
	    return answer;//"服务器上excel文件地址"或者"Error"字符;
	  }  
	  
	  //根据xlsFilePath对应的xls文件，将其内容读取出来，并写入数据库中
	  protected String excel2Db(String xlsFilePath) throws FileNotFoundException, IOException, BiffException{
	    
	//******************************************************************
	// 将传递过来路径的xls文件的第一个sheet的内容拼接为字符串
	//******************************************************************
	    // 1、构造excel文件输入流对象
	    String sFilePath = xlsFilePath;
	    InputStream is = new FileInputStream(sFilePath);
	    // 2、声明工作簿对象
	    Workbook rwb = Workbook.getWorkbook(is);
	    // 3、获得工作簿中工作表的个数,对应于一个excel中的工作表个数
	    rwb.getNumberOfSheets();//一般只用第一个sheet
	 
	    //---------------------------------------------
	    //如下内容需要根据excel模板以及excel表进行相应的修改
	    String theData="";//最后用于插入数据表语句insert的值
	    Sheet oFirstSheet = rwb.getSheet(0);// 使用索引形式获取第一个工作表，也可以使用rwb.getSheet(sheetName);其中sheetName表示的是工作表的名称
	    //System.out.println("工作表名称：" + oFirstSheet.getName());
	    int rows = oFirstSheet.getRows();//获取工作表中的总行数
	    int columns = oFirstSheet.getColumns();//获取工作表中的总列数
	    //System.out.println(rows+"  "+columns+"\r\n");
	    //所有内容都做字符处理
	    for (int i = 1; i < rows; i++) {//模板中的第一行作为标题行
	      theData+="(";
	      for (int j = 0; j < columns; j++) {//
	          Cell oCell= oFirstSheet.getCell(j,i);//需要注意的是这里的getCell方法的参数，第一个是指定第几列，第二个参数才是指定第几行
	          theData+="'"+oCell.getContents()+"',";//将单元格内容提取、拼接至theData
	      }
	      theData+="'123456',";//初始密码为123456
	      theData = theData.substring(0, theData.length() - 1);//获得了excel值
	      theData+="),";
	    }
	    
	    
	     theData = theData.substring(0, theData.length() - 1);
	      
	    //******************************************************************
	    //下面需要将theData写入数据库，这里需要根据写入数据表字段的需求进行修改
	    //******************************************************************
	    //1.构建数据库处理对象
	    String result="success"; 
	    return result;
	  }    
}
